<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
  <!ENTITY % general-entities SYSTEM "../general.ent">
  %general-entities;
]>

<sect1 id="ch-bootable-kernel" role="wrap">
  <?dbhtml filename="kernel.html"?>

  <sect1info condition="script">
    <productname>kernel</productname>
    <productnumber>&linux-version;</productnumber>
    <address>&linux-url;</address>
  </sect1info>

  <title>Linux-&linux-version;</title>

  <indexterm zone="ch-bootable-kernel">
    <primary sortas="a-Linux">Linux</primary>
  </indexterm>

  <sect2 role="package">
    <title/>

    <para>Ядро операционной системы.</para>

    <segmentedlist>
      <segtitle>&buildtime;</segtitle>
      <segtitle>&diskspace;</segtitle>

      <seglistitem>
        <seg>&linux-ch8-sbu;</seg>
        <seg>&linux-ch8-du;</seg>
      </seglistitem>
    </segmentedlist>

  </sect2>

  <sect2 role="installation">
    <title>Установка ядра</title>

    <para>Процесс сборки ядра состоит из нескольких этапов: настройка, компиляция и установка. Ознакомьтесь с файлом
	 <filename>README</filename> в дереве исходных кодов пакета чтобы узнать о других способах настройки ядра.</para>

    <para>Подготовьте пакет к компиляции выполнив следующую команду:</para>

<screen><userinput remap="pre">make mrproper</userinput></screen>

    <para>Выполнение этой команды гарантирует, что дерево исходных кодов ядра абсолютно чистое. Разработчики ядра рекомендуют, чтобы эта команда выполнялась перед каждым процессом компиляции. Обратите внимание что после распаковки пакета с исходным кодом не следует полагаться на его "чистоту".</para>

    <!-- Support for compiling a keymap into the kernel is deliberately removed -->

    <para>Настройте ядро с помощью псевдографического интерфейса. Для получения общей информации перейдите по ссылке <ulink url="&hints-root;kernel-configuration.txt"/>. В книге BLFS есть информация по поводу некоторых требований к конфигурации ядра для поддержки пакетов, которые отсутствуют в книге LFS. Эта информация доступна по ссылке  <ulink url="&blfs-book;longindex.html#kernel-config-index"/>. Дополнительная информация о настройке и сборке  ядра расположена по ссылке <ulink url="http://www.kroah.com/lkn/"/></para>

    <note>

      <para>Хорошей отправной точкой для настройки ядра, может стать запуск команды <command>make defconfig</command>. В результате её выполнения будет создана базовая конфигурация с учётом архитектуры машины.</para>

      <para>Убедитесь в том, что вы включили/отключили/указали указанные ниже параметры настройки, в ином случае, система может работать не правильно, или вовсе не загрузится:</para>

      <screen role="nodump" revision="sysv">
Device Drivers  ---&gt;
  Generic Driver Options  ---&gt;
   [ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
   [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]

Kernel hacking  ---&gt;
       Choose kernel unwinder (Frame pointer unwinder)  ---&gt; [CONFIG_UNWINDER_FRAME_POINTER]</screen>

      <screen role="nodump" revision="systemd">
General setup -->
   [ ] Enable deprecated sysfs features to support old userspace tools [CONFIG_SYSFS_DEPRECATED]
   [ ] Enable deprecated sysfs features by default [CONFIG_SYSFS_DEPRECATED_V2]
   [*] open by fhandle syscalls [CONFIG_FHANDLE]
   [ ] Auditing support [CONFIG_AUDIT]
   [*] Control Group support [CONFIG_CGROUPS]
Processor type and features  ---&gt;
   [*] Enable seccomp to safely compute untrusted bytecode [CONFIG_SECCOMP]
Networking support  ---&gt;
  Networking options  ---&gt;
   &lt;*&gt; The IPv6 protocol [CONFIG_IPV6]
Device Drivers  ---&gt;
  Generic Driver Options  ---&gt;
   [ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
   [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]
   [ ] Fallback user-helper invocation for firmware loading [CONFIG_FW_LOADER_USER_HELPER]
Firmware Drivers  ---&gt;
   [*] Export DMI identification via sysfs to userspace [CONFIG_DMIID]
File systems  ---&gt;
   [*] Inotify support for userspace [CONFIG_INOTIFY_USER]
   &lt;*&gt; Kernel automounter version 4 support (also supports v3) [CONFIG_AUTOFS4_FS]
  Pseudo filesystems  ---&gt;
   [*] Tmpfs POSIX Access Control Lists [CONFIG_TMPFS_POSIX_ACL]
   [*] Tmpfs extended attributes [CONFIG_TMPFS_XATTR]
Kernel hacking  ---&gt;
       Choose kernel unwinder (Frame pointer unwinder)  ---&gt; [CONFIG_UNWINDER_FRAME_POINTER]</screen>
    </note>

    <note revision="systemd">
      <para>Параметр "The IPv6 Protocol" строго не обязателен, однако разработчиками пакета systemd настоятельно рекомендуется его включить.</para>
    </note>

    <para revision="sysv">Также, есть некоторые опции, которые могут понадобиться в зависимости от конфигурации системы. Список параметров, необходимых для пакетов в книге BLFS - <ulink url="&lfs-root;blfs/view/&short-version;/longindex.html#kernel-config-index">BLFS</ulink>.</para>

    <note>
      <para>Если на хост системе используется UEFI, то после выполнения команды 'make defconfig' должны автоматически примениться параметры ядра, связанные с EFI.</para>

      <para>Для того, чтобы ядро LFS могло загружаться из среды UEFI, необходимо включить соответствующий параметр:</para>

<screen role="nodump">Processor type and features  ---&gt;
   [*]   EFI stub support  [CONFIG_EFI_STUB]</screen>

      <para>Более полное описание управления UEFI из LFS доступно по ссылке:
      <ulink
        url="http://www.linuxfromscratch.org/hints/downloads/files/lfs-uefi.txt"/>.
      </para>
    </note>

    <variablelist>
      <title>Разъяснение указанных параметров конфигурации:</title>

      <varlistentry>
        <term><parameter>Support for uevent helper</parameter></term>
        <listitem>
          <para>Наличие этого параметра может вызвать конфликт при управление устройствами через Udev / Eudev.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>Maintain a devtmpfs</parameter></term>
        <listitem>
          <para>При использовании этого параметра, будет осуществлена поддержка узлов устройств, заполняемых самим ядром, даже без запуска Udev. Udev будет работать поверх, управляя разрешениями и добавляя необходимые символические ссылки. Этот элемент конфигурации необходим всем пользователям Udev / Eudev.</para>
        </listitem>
      </varlistentry>

    </variablelist>

<screen role="nodump"><userinput>make menuconfig</userinput></screen>

    <variablelist>
      <title>Значение необязательных переменных окружения программы make:</title>

      <varlistentry>
        <term><parameter>LANG=&lt;host_LANG_value&gt; LC_ALL=</parameter></term>
        <listitem>
          <para>Задаёт настройку локали на ту, которая используется в хост системе для корректного отображения menuconfig при использовании интерфейса ncurses при генерации строк на текстовой консоли Linux с кодировкой UTF-8.</para>

          <para>Если используете, то убедитесь что заменили переменную <replaceable>&lt;host_LANG_value&gt;</replaceable> на значение переменной окружения <envar>$LANG</envar> их хост системы. Или можно использовать значение переменной окружения хос системы <envar>$LC_ALL</envar> или <envar>$LC_CTYPE</envar>.</para>
        </listitem>
      </varlistentry>

    </variablelist>

    <para>Кроме того, команда <command>make oldconfig</command> может быть более уместна в некоторых случаях. Дополнительную информацию см. В файле <filename>README</filename>.</para>

    <para>При желании, можно пропустить этап настройки, скопировав файл конфигурации ядра <filename>.config</filename> с вашей хост системы (в том случае, если такой файл присутствует) в предварительно распакованный каталог ядра <filename class="directory">linux-&linux-version;</filename>. Мы не рекомендуем такой подход. Гораздо полезнее изучить все параметры настройки и создать файл конфигурации ядра самостоятельно.</para>

    <para>Скомпилируйте образ ядра и модули:</para>

<screen><userinput remap="make">make</userinput></screen>

    <para>При использовании модулей, могут потребоваться файлы конфигурации, которые должны находиться в каталоге <filename class="directory">/etc/modprobe.d</filename>. Информация о модулях и конфигурации ядра
     находится в <xref linkend="ch-scripts-udev"/> и в каталоге с документацией ядра <filename
    class="directory">linux-&linux-version;/Documentation</filename>. Также будет интересным изучение информации <filename>modprobe.d(5)</filename>.</para>

    <para>Установите модули, если ядро их использует:</para>

<screen><userinput remap="install">make modules_install</userinput></screen>

    <para>После завершения компиляции, необходимо выполнить еще несколько шагов. Некоторые файлы должны быть скопированы в каталог <filename class="directory">/boot</filename>.</para>

    <caution>
      <para>Если хост система содержит отдельный раздел для каталога /boot, файлы скопированные ниже, должны находится в нём. Самый простой способ это сделать -  выполнить привязку (bind) каталога /boot хост системы (за пределами выполнения в среде chroot) к каталогу /mnt/lfs/boot перед тем, как продолжить. Из-под пользователя root в <emphasis>хост системе</emphasis> выполните команду:</para>

<screen role="nodump"><userinput>mount --bind /boot /mnt/lfs/boot</userinput></screen>
    </caution>

    <para>Путь к образу ядра зависит от используемой платформы. Имя файла, указанное ниже, может иметь произвольное наименование, на ваш вкус, но имя файла должно  начинаться с <emphasis>vmlinuz</emphasis> для обеспечения совместимости автоматической настройки процесса загрузки, описанного в следующей главе. При выполнении следующей команды, будет считать что используется архитектура x86:</para>

<screen revision="sysv"><userinput remap="install">cp -iv arch/x86/boot/bzImage /boot/vmlinuz-&linux-version;-lfs-&version;</userinput></screen>

<screen revision="systemd"><userinput remap="install">cp -iv arch/x86/boot/bzImage /boot/vmlinuz-&linux-version;-lfs-&versiond;</userinput></screen>

    <para><filename>System.map</filename> файл, внутри которого находится символьная таблица адресов функций и процедур, используемых ядром операционной системы Linux. В этой таблице перечислены имена переменных и функций и их адреса в памяти компьютера. Эта таблица весьма полезна при отладке ядра в случае Kernel panic или Linux oops. System.map генерируется при компиляции ядра. Выполните следующщую команду для установки файла <filename>System.map</filename>:</para>

<screen><userinput remap="install">cp -iv System.map /boot/System.map-&linux-version;</userinput></screen>

    <para>Файл конфигурации ядра <filename>.config</filename> полученный в результате настройки <command>make menuconfig</command> содержит в себе все опции конфигурации скомпилированного ядра. Хорошей идеей будет оставить этот файл для будующей работы:</para>

<screen><userinput remap="install">cp -iv .config /boot/config-&linux-version;</userinput></screen>

    <para>Установите документацию ядра:</para>

<screen><userinput remap="install">install -d /usr/share/doc/linux-&linux-version;
cp -r Documentation/* /usr/share/doc/linux-&linux-version;</userinput></screen>

    <para>Важно отметить, что файлы в каталоге исходных кодов ядра не принадлежат пользователю <emphasis>root</emphasis>. Всякий раз, когда пакет распаковывается от пользователя <emphasis>root</emphasis> (как это и выполнялось внутри среды chroot), файлы имеют те идентификаторы пользователя и группы, которые были назначены при распаковке. Обычно это не вызывает проблем для других устанавливаемых пакетов, так как каталог с исходными кодами удаляется после установки пакета. Однако исходный код ядра Linux часто сохраняется в течение длительного времени. Из-за этого существует вероятность того, что идентификатор пользователя, используемый при распаковке, будет назначен другому пользователю. В таком случае, этот пользователь будет иметь доступ на запись в этот каталог.</para>

    <note>
      <para>Во многих случаях конфигурация ядра должна быть
      обновлена для пакетов, которые будут установлены позже в BLFS.  В отличие от
      других пакетов удалять дерево исходного кода ядра не требуется
      после компиляции и установки.</para>

      <para>Если вы планируете оставить каталог с исходным кодом ядра, выполните команду:
      <command>chown -R 0:0</command> для каталога <filename
      class="directory">linux-&linux-version;</filename> чтобы указать права для пользователя <emphasis>root</emphasis>.</para>
    </note>

    <warning>
      <para>В документации ядра рекомендуется создать символическую ссылку <filename class="symlink">/usr/src/linux</filename> для указания местоположения каталога с исходными кодами ядра. Это рекомендация относится к ядрам до версии 2.6 и не должна выполняться в системе LFS, так как это может вызвать проблемы с пакетами, которые вы, возможно, захотите создать, когда ваша базовая система LFS будет готова.</para>
    </warning>

    <warning>
      <para>Заголовочные файлы в системном каталоге <filename class="directory">include</filename> (<filename class="directory">/usr/include</filename>) должны <emphasis>всегда</emphasis> быть те, которые использовались при компиляции Glibc в главе <xref linkend="ch-system-linux-headers"/>. Поэтому их <emphasis>никогда</emphasis> не следует заменять на чистые заголовочные файлы ядра или любые другие подготовленные заголовочные файлы.</para>
    </warning>

  </sect2>

  <sect2 id="conf-modprobe" role="configuration">
    <title>Настройка порядка загрузки модулей Linux</title>

    <indexterm zone="conf-modprobe">
      <primary sortas="e-/etc/modprobe.d/usb.conf">/etc/modprobe.d/usb.conf</primary>
    </indexterm>

    <para>Обычно модули Linux загружаются автоматически, но иногда требуется определенный порядок. Программа, которая загружает модули, <command>modprobe</command> или <command>insmod</command>, использует файл  <filename>/etc/modprobe.d/usb.conf</filename> как раз для этой цели. Этот файл должен быть создан так, что если USB-драйверы (ehci_hcd, ohci_hcd и uhci_hcd) были созданы в виде модулей, то они будут загружены в требуемом  порядке; ehci_hcd должен быть загружен до ohci_hcd и uhci_hcd для того, чтобы избежать предупреждений во время загрузки.</para>

    <para>Создайте новый файл<filename>/etc/modprobe.d/usb.conf</filename> выполнив следующую команду:</para>

<screen><userinput>install -v -m755 -d /etc/modprobe.d
cat &gt; /etc/modprobe.d/usb.conf &lt;&lt; "EOF"
<literal># Begin /etc/modprobe.d/usb.conf

install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true

# End /etc/modprobe.d/usb.conf</literal>
EOF</userinput></screen>

  </sect2>

  <sect2 id="contents-kernel" role="content">
    <title>Содержимое пакета Linux</title>

    <segmentedlist>
      <segtitle>Установленные файлы</segtitle>
      <segtitle>Установленные каталоги</segtitle>

      <seglistitem>
        <seg>config-&linux-version;,
        <phrase revision="sysv">vmlinuz-&linux-version;-lfs-&version;,</phrase>
        <phrase revision="systemd">vmlinuz-&linux-version;-lfs-&versiond;,</phrase>
        and System.map-&linux-version;</seg>
        <seg>/lib/modules, /usr/share/doc/linux-&linux-version;</seg>
      </seglistitem>
    </segmentedlist>

    <variablelist>
      <bridgehead renderas="sect3">Краткое описание</bridgehead>
      <?dbfo list-presentation="list"?>
      <?dbhtml list-presentation="table"?>

      <varlistentry id="config">
        <term><filename>config-&linux-version;</filename></term>
        <listitem>
          <para>Файл конфигурации ядра <filename>.config</filename> содержит в себе все опции конфигурации скомпилированного ядра.</para>
          <indexterm zone="ch-bootable-kernel config">
            <primary sortas="e-/boot/config">/boot/config-&linux-version;</primary>
          </indexterm>
        </listitem>
      </varlistentry>

      <varlistentry id="lfskernel">
        <term revision="sysv"><filename>vmlinuz-&linux-version;-lfs-&version;</filename></term>
        <term revision="systemd"><filename>vmlinuz-&linux-version;-lfs-&versiond;</filename></term>
        <listitem>
          <para>Ядро системы Linux. При включении компьютера ядро - первая часть операционной системы, которая будет загружена. Она обнаруживает и инициализирует все компоненты оборудования компьютера, делает их доступными в виде дерева каталогов с файлами для доступа к ним программам и превращает один процессор в мультизадачную машину, способную выполнять множество программ как будто одновременно.</para>
          <indexterm zone="ch-bootable-kernel lfskernel">
            <primary sortas="b-lfskernel">lfskernel-&linux-version;</primary>
          </indexterm>
        </listitem>
      </varlistentry>

      <varlistentry id="System.map">
        <term><filename>System.map-&linux-version;</filename></term>
        <listitem>
          <para>файл, внутри которого находится символьная таблица адресов функций и процедур, используемых ядром операционной системы Linux. В этой таблице перечислены имена переменных и функций и их адреса в памяти компьютера. Эта таблица весьма полезна при отладке ядра в случае Kernel panic или Linux oops. System.map генерируется при компиляции ядра.</para>
          <indexterm zone="ch-bootable-kernel System.map">
            <primary sortas="e-/boot/System.map">/boot/System.map-&linux-version;</primary>
          </indexterm>
        </listitem>
      </varlistentry>

    </variablelist>

  </sect2>

</sect1>
